package android.maps;

import java.util.ArrayList;

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.util.SimpleNodeIterator;

public class ParserCabanas {
	
    private Parser parser;
    private String URL = "http://buscador.emol.com/";
    private String dispatcher1 = "dispatcher.php?query=turismo&offset="; //numero
    private String dispatcher2 = "&portal=amarillas&sort=prioridad&sortdir=descending&query2="; //Categoria
    private String dispatcher3 = "&clas=CABA%C3%91AS%20PARA%20TURISMO&cn=emol&Submit=Buscar";
    
    public ParserCabanas () {
        try {
            this.parser = new Parser(URL + dispatcher1 + "0" + dispatcher2 + dispatcher3);
        } catch (ParserException e) {
            this.parser = null;
            e.printStackTrace();
        }
    }

    public ArrayList<Cabana> getCabanas(int cantidad){

        ArrayList<Cabana> cabanas = new ArrayList<Cabana>();
        this.parser.reset();

        int encontrados = 0;
        /*int cantidad = 0;

        try{
            NodeList ct = parser.parse(new HasAttributeFilter("class","time_result"));
            Node [] no = ct.toNodeArray();

            String res = no[0].toPlainTextString().trim();
            String r[] = res.split(",");
            r[1] = r[1].trim();

            r = r[1].split(" ");
            r[5] = r[5].replace(".", "");

            cantidad = Integer.parseInt(r[5]);

        }catch(Exception e){
                cantidad = 0;
        }*/

        this.parser.reset();

        do{
            try{
                NodeList nodos = parser.parse(new HasAttributeFilter("class","resultado"));
                SimpleNodeIterator iter = nodos.elements();

                //Se obtiene la información de todas las cabañas de la página actual.
                while(iter.hasMoreNodes()){

                    Cabana r = new Cabana();

                    Node n = iter.nextNode();
                    NodeList nchildren = n.getChildren();

                    //Latitud y Longitud
                    try{
                        NodeList posicionCabana = nchildren.extractAllNodesThatMatch(new HasAttributeFilter("class","puntomapa"), true);
                        Node []n3 = posicionCabana.toNodeArray();
                        String slat, slon;
                        int lat, lon;

                        //Funcion que limpia la latitud y la longitud del tag
                        if(n3.length > 0){
                            /*
                             * Se limpia el siguiente tag:
                             *
                             * <div class="puntomapa" onclick="javascript:initMarkers(0);moverMap('-33.44979441','-70.67563307',15);move_to_map('300050331',0);activateMapThumbnail('300050331');return false;">
                             *  <img src="img/punto_mapa.png" id="img300050331" class="imagenesAmarillas"/>
                             * </div>
                             *
                             * donde se extrae la latitud y longitud de la funcion moverMap
                             */
                            String tag = posicionCabana.toHtml();

                            String moveToMap = tag.substring(tag.indexOf("moverMap('")+10);
                            moveToMap = moveToMap.substring(0, moveToMap.indexOf(")"));
                            moveToMap = moveToMap.replace("'", "");
                            String[] coordenadas = moveToMap.split(",");

                            /*
                             * coordenadas[0]: Latitud
                             * coordenadas[1]: Longitud
                             *
                             * */

                            slat = coordenadas[0];
                            slon = coordenadas[1];
                        }else{
                            slat = "0";
                            slon = "0";
                        }


                        lat = (int) (Double.parseDouble(slat) * 1E6);
                        lon = (int) (Double.parseDouble(slon) * 1E6);


                        r.setLatitud(lat);
                        r.setLongitud(lon);
                    }catch(Exception e){
                    	r.setLatitud(0);
                        r.setLongitud(0);
                    }

                    
                    //solo se almacena la información de la cabaña si tiene coordenadas.
                    if(r.getLatitud() != 0 || r.getLongitud() != 0) {

                        //NombreCabana
                        NodeList nombreCabana = nchildren.extractAllNodesThatMatch(new HasAttributeFilter("class","title"), true);
                        nombreCabana = nombreCabana.extractAllNodesThatMatch(new TagNameFilter("a"), true);
                        try{
                            r.setNombre(nombreCabana.asString().toString());
                        }catch(Exception e){
                                r.setNombre("Error en captura de datos");
                        }

                        //ComunaCabana
                        NodeList comunaCabana = nchildren.extractAllNodesThatMatch(new HasAttributeFilter("class","sep"), true);
                        comunaCabana = comunaCabana.extractAllNodesThatMatch(new TagNameFilter("em"), true);
                        Node []n1 = comunaCabana.toNodeArray();
                        try{
                                r.setComuna(n1[0].getNextSibling().getText());
                                r.setRegion(r.getComuna());
                        }catch(Exception e){
                                r.setComuna("Error en captura de datos");
                        }


                        //CalleCabana
                        NodeList calleCabana = nchildren.extractAllNodesThatMatch(new HasAttributeFilter("class","sep"), true);
                        calleCabana = calleCabana.extractAllNodesThatMatch(new TagNameFilter("div"), true);
                        Node nodes[] = calleCabana.toNodeArray();
                        try{
                                r.setDireccion(nodes[2].toPlainTextString().trim());
                        }catch(Exception e){
                                r.setDireccion("Error en captura de datos");
                        }


                        //Telefonos y Faxes
                        NodeList telCabana = nchildren.extractAllNodesThatMatch(new HasAttributeFilter("class","tel"), true);
                        telCabana = telCabana.extractAllNodesThatMatch(new TagNameFilter("span"), true);
                        Node []n2 = telCabana.toNodeArray();
                        for(int i = 0; i < n2.length; i++){
                                try{
                                        String tel = n2[i].toPlainTextString().split(":")[1].trim();
                                        if(i == 0) r.setTelefono(tel);
                                        r.addTelefono(tel);
                                }catch(Exception e){

                                }
                        }

                        //Web
                        try{
                            NodeList webCabana = nchildren.extractAllNodesThatMatch(new HasAttributeFilter("class","herramientas_amarrillas"), true);
                            webCabana = webCabana.extractAllNodesThatMatch(new TagNameFilter("a"), true);
                            Node []wr = webCabana.toNodeArray();

                            for(int j = 0; j < wr.length; j++){
                                    if(wr[j].toPlainTextString().equals("web")){
                                            String limpiar_url = wr[j].toHtml().substring(wr[j].toHtml().indexOf("url="));
                                            limpiar_url = limpiar_url.replace("url=", "");
                                            limpiar_url = limpiar_url.replace("'>web</a>", "");
                                            r.setURL(limpiar_url);
                                    }
                            }
                        }catch(Exception e){
                            r.setURL("");
                            System.out.println("Error");
                        };

                        cabanas.add(r);
                    }
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }

            // Se cambian los dispatcher para parsear las siguientes páginas que contienen la información (de la 2 en adelante).
            if (encontrados == 0) {
                dispatcher1 = "dispatcher.php?query=turismo&query2=&offset=";
                dispatcher2 = "&portal=amarillas&sort=prioridad&sortdir=descending";
                dispatcher3 = "&clas=CABA%C3%91AS%20PARA%20TURISMO&o2=10&o3=20&o4=30&cn=emol&Submit=Buscar";
            }

            encontrados += 10;
            if(encontrados < cantidad)
            try {
                this.parser = new Parser(URL + dispatcher1 + encontrados + dispatcher2 + dispatcher3);
            } catch (ParserException e) {
                return null;
            }

        }while(encontrados < cantidad);

        return cabanas;
    }
}
